package com.itranswarp.demo04;

import com.itranswarp.demo03.Rent;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @File    :   ProxyInvocationHandler
 * @Time    :   2021/6/15 9:36 下午
 * @Author  :   Zhang Hong
 * @Version :   1.0
 * @Contact :   zh224635@163.com
 * @Desc    :   TODO  使用这个类动态生成代理类
 **/

public class ProxyInvocationHandler implements InvocationHandler {

    private Object target;
    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     * @Method  :   getProxy
     * @Time    :   2021/6/15 9:38 下午
     * @Author  :   Zhang Hong
     * @Version :   1.0
     * @Contact :   zh224635@163.com
     * @Desc    :   TODO 生成得到代理类
     * public static Object newProxyInstance​(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
     * 返回指定接口的代理实例，该接口将方法调用分派给指定的调用处理程序。
     **/



    public Object getProxy(){
        return  Proxy.
                newProxyInstance(
                        this.getClass().
                                getClassLoader(),
                        target.getClass().
                                getInterfaces() ,
                        this);
    }
    /**
     * @Method  :   invoke
     * @Time    :   2021/6/15 9:37 下午
     * @Author  :   Zhang Hong
     * @Version :   1.0
     * @Contact :   zh224635@163.com
     * @Desc    :   TODO 处理代理实例,并返回结果.
     **/
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        //动态代理的本质, 就是使用反射机制
        Object result = method.invoke(target, args);
        return result;

    };

    public void log(String msg){
        System.out.println("执行了" + msg + "方法");
    }

}
